<?php
namespace Swiftx\Internet;
use Swiftx\System\Object;

/**
 * ---------------------------------------------------------------------------------------------------------------------
 * Curl程序
 * ---------------------------------------------------------------------------------------------------------------------
 * @author		Hismer <odaytudio@gmail.com>
 * @since		2014-02-09
 * @copyright	Copyright (c) 2014-2015 Swiftx Inc.
 * ---------------------------------------------------------------------------------------------------------------------
 * @property bool ReturnTransfer 是否以文件流的形式返回
 * @property string CustomreQuest 传输方式
 * @property string PostFields 传输的值
 * @property string HttpHeader 传输值的方式 设置header
 * ---------------------------------------------------------------------------------------------------------------------
 */
class Curl extends Object {

	/** @var resource  */
	private $_resource;
	
	//构造函数，初始化资源
	public function __construct($url = null){
		$this->_resource = curl_init($url);
	}
	
	//析构函数，释放所有资源
	public function __destruct(){
		curl_close($this->_resource);
	}
	
	// 获取cURL版本信息
	protected function _getVersion(){
		return curl_version();
	}
	
	// 当根据Location:重定向时，自动设置header中的Referer:信息 
	protected function _setAutoReferer($value){
		curl_setopt($this->_resource, CURLOPT_AUTOREFERER, $value);
	}
	
	//在启用时，返回原生的（Raw）输出
	protected function _setBinaryTransfer($value){
		curl_setopt($this->_resource, CURLOPT_BINARYTRANSFER, $value);
	}
	
	//启用时,curl会仅仅传递一个session cookie，忽略其他的cookie
	protected function _setCookieSession($value){
		curl_setopt($this->_resource, CURLOPT_COOKIESESSION, $value);
	}
	
	//启用时将Unix的换行符转换成回车换行符
	protected function _setCrlf($value){
		curl_setopt($this->_resource, CURLOPT_CRLF, $value);
	}
	
	//启用时会启用一个全局的DNS缓存
	protected function _setDnsUseGlobalCache($value){
		curl_setopt($this->_resource, CURLOPT_DNS_USE_GLOBAL_CACHE, $value);
	}
	
	//显示HTTP状态码
	protected function _setFilonError($value){
		curl_setopt($this->_resource, CURLOPT_FAILONERROR, $value);
	}
	
	//启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回
	protected function _setFileTime($value){
		curl_setopt($this->_resource, CURLOPT_FILETIME, $value);
	}

	//启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器，使用CURLOPT_MAXREDIRS可以限定递归返回的数量
	protected function _setFollowLocation($value){
		curl_setopt($this->_resource, CURLOPT_FOLLOWLOCATION, $value);
	}

	//在完成交互以后强迫断开连接，不能重用
	protected function _setForbidReuse($value){
		curl_setopt($this->_resource, CURLOPT_FORBID_REUSE, $value);
	}

	//强制获取一个新的连接，替代缓存中的连接
	protected function _setFreshConnect($value){
		curl_setopt($this->_resource, CURLOPT_FRESH_CONNECT, $value);
	}

	//启用时当FTP下载时，使用EPRT (或 LPRT)命令。设置为FALSE时禁用EPRT和LPRT，使用PORT命令 only
	protected function _setFtpUseEprt($value){
		curl_setopt($this->_resource, CURLOPT_FTP_USE_EPRT, $value);
	}

	//启用时，在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令
	protected function _setFtpUseEpsv($value){
		curl_setopt($this->_resource, CURLOPT_FTP_USE_EPSV, $value);
	}

	//启用时追加写入文件而不是覆盖它
	protected function _setFtpAppEnd($value){
		curl_setopt($this->_resource, CURLOPT_FTPAPPEND, $value);
	}

	//CURLOPT_TRANSFERTEXT的别名
	protected function _setFtpAscii($value){
		curl_setopt($this->_resource, CURLOPT_FTPASCII, $value);
	}

	//启用时只列出FTP目录的名字
	protected function _setFtpListOnly($value){
		curl_setopt($this->_resource, CURLOPT_FTPLISTONLY, $value);
	}

	//启用时会将头文件的信息作为数据流输出
	protected function _setHeader($value){
		curl_setopt($this->_resource, CURLOPT_HEADER, $value);
	}

	//启用时追踪句柄的请求字符串
	protected function _setHeaderOut($value){
		curl_setopt($this->_resource, CURLOPT_HEADER_OUT, $value);
	}

	//启用时会设置HTTP的method为GET，因为GET是默认是，所以只在被修改的情况下使用
	protected function _setHttpGet($value){
		curl_setopt($this->_resource, CURLOPT_HTTPGET, $value);
	}

	//启用时会通过HTTP代理来传输
	protected function _setHttpProxyTunnel($value){
		curl_setopt($this->_resource, CURLOPT_HTTPPROXYTUNNEL, $value);
	}

	//启用时将cURL函数中所有修改过的参数恢复默认值
	protected function _setMute($value){
		curl_setopt($this->_resource, CURLOPT_MUTE, $value);
	}

	//在连接建立以后，访问~/.netrc文件获取用户名和密码信息连接远程站点
	protected function _setNetrc($value){
		curl_setopt($this->_resource, CURLOPT_NETRC, $value);
	}

	//启用时将不对HTML中的BODY部分进行输出
	protected function _setNoBody($value){
		curl_setopt($this->_resource, CURLOPT_NOBODY, $value);
	}

	//启用时关闭curl传输的进度条
	protected function _setNoproGress($value){
		curl_setopt($this->_resource, CURLOPT_NOPROGRESS, $value);
	}

	//启用时忽略所有的curl传递给php进行的
	protected function _setNoSignal($value){
		curl_setopt($this->_resource, CURLOPT_NOSIGNAL, $value);
	}

	//启用时会发送一个常规的POST请求，类型为：application/x-www-form-urlencoded
	protected function _setPost($value){
		curl_setopt($this->_resource, CURLOPT_POST, $value);
	}

	//启用时允许HTTP发送文件，必须同时设置CURLOPT_INFILE和CURLOPT_INFILESIZE
	protected function _setPut($value){
		curl_setopt($this->_resource, CURLOPT_PUT, $value);
	}
	
	//将curl_exec()获取的信息以文件流的形式返回，而不是直接输出
	protected function _setReturnTransfer($value){
		curl_setopt($this->_resource, CURLOPT_RETURNTRANSFER, $value);
	}

	//禁用后cURL将终止从服务端进行验证
	protected function _setSslVerifyPeer($value){
		curl_setopt($this->_resource, CURLOPT_SSL_VERIFYPEER, $value);
	}

	//启用后对FTP传输使用ASCII模式
	protected function _setTransFertext($value){
		curl_setopt($this->_resource, CURLOPT_TRANSFERTEXT, $value);
	}

	//启用时产生的header中的多个locations中持续追加用户名和密码信息
	protected function _setUnreStrictedAuth($value){
		curl_setopt($this->_resource, CURLOPT_UNRESTRICTED_AUTH, $value);
	}

	//启用后允许文件上传
	protected function _setUpload($value){
		curl_setopt($this->_resource, CURLOPT_UPLOAD, $value);
	}

	//启用时会汇报所有的信息
	protected function _setVerbose($value){
		curl_setopt($this->_resource, CURLOPT_VERBOSE, $value);
	}
	
	//每次获取的数据中读入缓存的大小，但是不保证这个值每次都会被填满。	
	protected function _setBufferSize($value){
		curl_setopt($this->_resource, CURLOPT_BUFFERSIZE, $value);
	}

	//不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST，还存在另外三个CURLCLOSEPOLICY_，但是cURL暂时还不支持。
	protected function _setClosePolicy($value){
		curl_setopt($this->_resource, CURLOPT_CLOSEPOLICY, $value);
	}

	//在发起连接前等待的时间，如果设置为0，则无限等待。	
	protected function _setConnectTimeOut($value){
		curl_setopt($this->_resource, CURLOPT_CONNECTTIMEOUT, $value);
	}

	//尝试连接等待的时间，以毫秒为单位。如果设置为0，则无限等待。	
	protected function _setConnectTimeOutMs($value){
		curl_setopt($this->_resource, CURLOPT_CONNECTTIMEOUT_MS, $value);
	}
	
	//设置在内存中保存DNS信息的时间，默认为120秒。	
	protected function _setDnsCacheTimeOut($value){
		curl_setopt($this->_resource, CURLOPT_DNS_CACHE_TIMEOUT, $value);
	}

	//CURL_HTTP_VERSION_NONE (默认值，让cURL自己判断使用哪个版本)，CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。	
	protected function _setFtpSslAuth($value){
		curl_setopt($this->_resource, CURLOPT_FTPSSLAUTH, $value);
	}
	
	//使用的HTTP验证方法，可选的值有：CURLAUTH_BASIC、CURLAUTH_DIGEST、CURLAUTH_GSSNEGOTIATE、CURLAUTH_NTLM、CURLAUTH_ANY和CURLAUTH_ANYSAFE。
	protected function _setHttpVersion($value){
		curl_setopt($this->_resource, CURLOPT_HTTP_VERSION, $value);
	}
	
	//设定上传文件的大小限制，字节(byte)为单位。	
	protected function _setHttpAuth($value){
		curl_setopt($this->_resource, CURLOPT_HTTPAUTH, $value);
	}
	
	//当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec)，PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。	
	protected function _setInFileSize($value){
		curl_setopt($this->_resource, CURLOPT_INFILESIZE, $value);
	}
	
	//当传输速度小于CURLOPT_LOW_SPEED_LIMIT时(bytes/sec)，PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。	
	protected function _setLowSpeedLimit($value){
		curl_setopt($this->_resource, CURLOPT_LOW_SPEED_LIMIT, $value);
	}
	
	//允许的最大连接数量，超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。	
	protected function _setLowSpeedTime($value){
		curl_setopt($this->_resource, CURLOPT_LOW_SPEED_TIME, $value);
	}

	//指定最多的HTTP重定向的数量，这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。	
	protected function _setMaxConnects($value){
		curl_setopt($this->_resource, CURLOPT_MAXCONNECTS, $value);
	}

	//用来指定连接端口。（可选项）	
	protected function _setMaxRedirs($value){
		curl_setopt($this->_resource, CURLOPT_MAXREDIRS, $value);
	}

	//CURLPROTO_*的位域指。如果被启用，位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议，但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS.
	protected function _setPort($value){
		curl_setopt($this->_resource, CURLOPT_PORT, $value);
	}

	//HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASIC和CURLAUTH_NTLM当前被支持。	
	protected function _setProtocols($value){
		curl_setopt($this->_resource, CURLOPT_PROTOCOLS, $value);
	}
	
	//代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。	
	protected function _setProxyAuth($value){
		curl_setopt($this->_resource, CURLOPT_PROXYAUTH, $value);
	}
	
	//不是CURLPROXY_HTTP (默认值) 就是CURLPROXY_SOCKS5。	
	protected function _setProxyPort($value){
		curl_setopt($this->_resource, CURLOPT_PROXYPORT, $value);
	}

	//CURLPROTO_*中的位域值。如果被启用，位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILE和SCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量，请参照CURLOPT_PROTOCOLS。	
	protected function _setProxyType($value){
		curl_setopt($this->_resource, CURLOPT_PROXYTYPE, $value);
	}

	//CURLPROTO_*中的位域值。如果被启用，位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILE和SCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量，请参照CURLOPT_PROTOCOLS。	
	protected function _setRedirProtocols($value){
		curl_setopt($this->_resource, CURLOPT_REDIR_PROTOCOLS, $value);
	}

	//在恢复传输时传递一个字节偏移量（用来断点续传）。	
	protected function _setResumeFrom($value){
		curl_setopt($this->_resource, CURLOPT_RESUME_FROM, $value);
	}

	//在恢复传输时传递一个字节偏移量（用来断点续传）。	
	protected function _setSslVerifyHost($value){
		curl_setopt($this->_resource, CURLOPT_SSL_VERIFYHOST, $value);
	}

	//1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注：公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在，并且是否与提供的主机名匹配。	
	protected function _setSslVersion($value){
		curl_setopt($this->_resource, CURLOPT_SSLVERSION, $value);
	}
	
	//使用的SSL版本(2 或 3)。默认情况下PHP会自己检测这个值，尽管有些情况下需要手动地进行设置。	
	protected function _setTimeCondition($value){
		curl_setopt($this->_resource, CURLOPT_TIMECONDITION, $value);
	}
	
	//如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过，则使用CURL_TIMECOND_IFMODSINCE返回页面，如果没有被修改过，并且CURLOPT_HEADER为true，则返回一个"304 Not Modified"的header， CURLOPT_HEADER为false，则使用CURL_TIMECOND_IFUNMODSINCE，默认值为CURL_TIMECOND_IFUNMODSINCE。	
	protected function _setTimeOut($value){
		curl_setopt($this->_resource, CURLOPT_TIMEOUT, $value);
	}
	
	//设置cURL允许执行的最长秒数。	
	protected function _setTimeOutMs($value){
		curl_setopt($this->_resource, CURLOPT_TIMEOUT_MS, $value);
	}
	
	//设置cURL允许执行的最长毫秒数。	
	protected function _setTimeValue($value){
		curl_setopt($this->_resource, CURLOPT_TIMEVALUE, $value);
	}
	
	//一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 .	
	protected function _setCaInfo($value){
		curl_setopt($this->_resource, CURLOPT_CAINFO, $value);
	}
	
	//一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。	
	protected function _setCaPath($value){
		curl_setopt($this->_resource, CURLOPT_CAPATH, $value);
	}
	
	//设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔，分号后带一个空格(例如， "fruit=apple; colour=red")。	
	protected function _setCookie($value){
		curl_setopt($this->_resource, CURLOPT_COOKIE, $value);
	}
	
	//包含cookie数据的文件名，cookie文件的格式可以是Netscape格式，或者只是纯HTTP头部信息存入文件。	
	protected function _setCookieFile($value){
		curl_setopt($this->_resource, CURLOPT_COOKIEFILE, $value);
	}
	
	//连接结束后保存cookie信息的文件。	
	protected function _setCookieJar($value){
		curl_setopt($this->_resource, CURLOPT_COOKIEJAR, $value);
	}

	//使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求
	protected function _setCustomreQuest($value){
		curl_setopt($this->_resource, CURLOPT_CUSTOMREQUEST, $value);
	}
	
	//类似CURLOPT_RANDOM_FILE，除了一个Entropy Gathering Daemon套接字。	
	protected function _setEgdSocket($value){
		curl_setopt($this->_resource, CURLOPT_EGDSOCKET, $value);
	}
	
	//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity"，"deflate"和"gzip"。如果为空字符串""，请求头会发送所有支持的编码类型。	
	protected function _setEncoding($value){
		curl_setopt($this->_resource, CURLOPT_ENCODING, $value);
	}
	
	//这个值将被用来获取供FTP"POST"指令所需要的IP地址。"POST"指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名（UNIX下）或者只是一个'-'来使用默认的IP地址。	
	protected function _setFtpPort($value){
		curl_setopt($this->_resource, CURLOPT_FTPPORT, $value);
	}
	
	//网络发送接口名，可以是一个接口名、IP地址或者是一个主机名。	
	protected function _setInterFace($value){
		curl_setopt($this->_resource, CURLOPT_INTERFACE, $value);
	}
	
	//KRB4 (Kerberos 4) 安全级别。
	protected function _setKrb4Level($value){
		curl_setopt($this->_resource, CURLOPT_KRB4LEVEL, $value);
	}
	
	//全部数据使用HTTP协议中的"POST"操作来发送。要发送文件，在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1&para2=val2&...'或使用一个以字段名为键值，字段数据为值的数组
	protected function _setPostFields($value){
		curl_setopt($this->_resource, CURLOPT_POSTFIELDS, $value);
	}

	//HTTP代理通道。	
	protected function _setProxy($value){
		curl_setopt($this->_resource, CURLOPT_PROXY, $value);
	}
	
	//一个用来连接到代理的"[username]:[password]"格式的字符串。	
	protected function _setProxyUserPwd($value){
		curl_setopt($this->_resource, CURLOPT_PROXYUSERPWD, $value);
	}
	
	//一个被用来生成SSL随机数种子的文件名。	
	protected function _setRandomFile($value){
		curl_setopt($this->_resource, CURLOPT_RANDOM_FILE, $value);
	}
	
	//以"X-Y"的形式，其中X和Y都是可选项获取数据的范围，以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如"X-Y,N-M"。	
	protected function _setRange($value){
		curl_setopt($this->_resource, CURLOPT_RANGE, $value);
	}
	
	//在HTTP请求头中"Referer: "的内容。	
	protected function _setReferer($value){
		curl_setopt($this->_resource, CURLOPT_REFERER, $value);
	}
	
	//一个SSL的加密算法列表。例如RC4-SHA和TLSv1都是可用的加密列表。	
	protected function _setSslCipherList($value){
		curl_setopt($this->_resource, CURLOPT_SSL_CIPHER_LIST, $value);
	}
	
	//一个包含PEM格式证书的文件名。	
	protected function _setSslCert($value){
		curl_setopt($this->_resource, CURLOPT_SSLCERT, $value);
	}
	
	//使用CURLOPT_SSLCERT证书需要的密码。	
	protected function _setSslCertPasswd($value){
		curl_setopt($this->_resource, CURLOPT_SSLCERTPASSWD, $value);
	}
	
	//证书的类型。支持的格式有"PEM" (默认值), "DER"和"ENG"。	
	protected function _setSslCertType($value){
		curl_setopt($this->_resource, CURLOPT_SSLCERTTYPE, $value);
	}
	
	//用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。	
	protected function _setSslEngine($value){
		curl_setopt($this->_resource, CURLOPT_SSLENGINE, $value);
	}
	
	//用来做非对称加密操作的变量。	
	protected function _setSslEngineDefault($value){
		curl_setopt($this->_resource, CURLOPT_SSLENGINE_DEFAULT, $value);
	}
	
	//包含SSL私钥的文件名。	
	protected function _setSslKey($value){
		curl_setopt($this->_resource, CURLOPT_SSLKEY, $value);
	}
	
	//在CURLOPT_SSLKEY中指定了的SSL私钥的密码。
	protected function _setSslKeyPasswd($value){
		curl_setopt($this->_resource, CURLOPT_SSLKEYPASSWD, $value);
	}
	
	//CURLOPT_SSLKEY中规定的私钥的加密类型，支持的密钥类型为"PEM"(默认值)、"DER"和"ENG"。	
	protected function _setSslKeyType($value){
		curl_setopt($this->_resource, CURLOPT_SSLKEYTYPE, $value);
	}
	
	//需要获取的URL地址，也可以在curl_init()函数中设置。	
	protected function _setUrl($value){
		curl_setopt($this->_resource, CURLOPT_URL, $value);
	}
	
	//在HTTP请求中包含一个"Role-Agent: "头的字符串。
	protected function _setUserAgent($value){
		curl_setopt($this->_resource, CURLOPT_USERAGENT, $value);
	}
	
	//传递一个连接中需要的用户名和密码，格式为："[username]:[password]"。	
	protected function _setUserPwd($value){
		curl_setopt($this->_resource, CURLOPT_USERPWD, $value);
	}

	//200响应码数组，数组中的响应吗被认为是正确的响应，否则被认为是错误的。	
	protected function _setHttp200Aliases(array $value){
		curl_setopt($this->_resource, CURLOPT_HTTP200ALIASES, $value);
	}

	//一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置： array('Content-type: text/plain', 'Content-length: 100')	
	protected function _setHttpHeader(array $value){
		curl_setopt($this->_resource, CURLOPT_HTTPHEADER, $value);
	}
	
	//在FTP请求执行完成后，在服务器上执行的一组FTP命令。	
	protected function _setPostQuote(array $value){
		curl_setopt($this->_resource, CURLOPT_POSTQUOTE, $value);
	}
	
	//一组先于FTP请求的在服务器上执行的FTP命令
	protected function _setQuote(array $value){
		curl_setopt($this->_resource, CURLOPT_QUOTE, $value);
	}

	//最后一个有效的URL地址
	protected function _getEffectiveUrl(){
		return curl_getinfo($this->_resource, CURLINFO_EFFECTIVE_URL);
	}
	
	//最后一个收到的HTTP代码
	protected function _getHttpCode(){
		return curl_getinfo($this->_resource, CURLINFO_HTTP_CODE);
	}
	
	//远程获取文档的时间，如果无法获取，则返回值为“-1”
	protected function _getFileTime(){
		return curl_getinfo($this->_resource, CURLINFO_FILETIME);
	}
	
	//最后一次传输所消耗的时间
	protected function _getTotalTime(){
		return curl_getinfo($this->_resource, CURLINFO_TOTAL_TIME);
	}
	
	//名称解析所消耗的时间
	protected function _getNameLookUpTime(){
		return curl_getinfo($this->_resource, CURLINFO_NAMELOOKUP_TIME);
	}
	
	//建立连接所消耗的时间
	protected function _getConnectTime(){
		return curl_getinfo($this->_resource, CURLINFO_CONNECT_TIME);
	}
	
	// 从建立连接到准备传输所使用的时间
	protected function _getPretransferTime(){
		return curl_getinfo($this->_resource, CURLINFO_PRETRANSFER_TIME);
	}
	
	//从建立连接到传输开始所使用的时间
	protected function _getStartTransferTime(){
		return curl_getinfo($this->_resource, CURLINFO_STARTTRANSFER_TIME);
	}

	//在事务传输开始前重定向所使用的时间
	protected function _getRedirectTime(){
		return curl_getinfo($this->_resource, CURLINFO_REDIRECT_TIME);
	}
	
	//上传数据量的总值
	protected function _getSizeUpload(){
		return curl_getinfo($this->_resource, CURLINFO_SIZE_UPLOAD);
	}
	
	//下载数据量的总值
	protected function _getSizeDownload(){
		return curl_getinfo($this->_resource, CURLINFO_SIZE_DOWNLOAD);
	}
	
	//平均下载速度
	protected function _getSpeedDownload(){
		return curl_getinfo($this->_resource, CURLINFO_SPEED_DOWNLOAD);
	}
	
	//平均上传速度
	protected function _getSpeedUpload(){
		return curl_getinfo($this->_resource, CURLINFO_SPEED_UPLOAD);
	}

	//header部分的大小
	protected function _getHeaderSize(){
		return curl_getinfo($this->_resource, CURLINFO_HEADER_SIZE);
	}
	
	//发送请求的字符串
	protected function _getHeaderOut(){
		return curl_getinfo($this->_resource, CURLINFO_HEADER_OUT);
	}
	
	//在HTTP请求中有问题的请求的大小
	protected function _getRequestSize (){
		return curl_getinfo($this->_resource, CURLINFO_REQUEST_SIZE );
	}
	
	//通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果
	protected function _getSslVerifyResult(){
		return curl_getinfo($this->_resource, CURLINFO_SSL_VERIFYRESULT);
	}
	
	//从Content-Length: field中读取的下载内容长度
	protected function _getContentLengthDownload(){
		return curl_getinfo($this->_resource, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
	}
	
	//上传内容大小的说明
	protected function _getContentLenghUpload(){
		return curl_getinfo($this->_resource, CURLINFO_CONTENT_LENGTH_UPLOAD);
	}
	
	//下载内容的Content-Type:值，NULL表示服务器没有发送有效的Content-Type: header
	protected function _setContentType(){
		return curl_getinfo($this->_resource, CURLINFO_CONTENT_TYPE);
	}
	
	// 执行Curl操作
	public function Exec(){
		$result = curl_exec($this->_resource);
		if($result === false)
			throw new Exception(1,'Curl执行失败!');
		return $result;
	}
	
	//解码给定的 URL 编码的字符串。
	public function Unescape($str){
		$result = curl_unescape($this->_resource, $str);
		if($result === false)
			throw new Exception(1,'Curl执行失败!');
		return $result;
	}
	
	//使用 URL 编码给定的字符串
	public function Escape($str){
		$result = curl_escape($this->_resource, $str);
		if($result === false)
			throw new Exception(1,'Curl执行失败!');
		return $result;
	}

    /**
     * 设置Cookies
     * @param $data
     */
    public function setCookies($data){
        $str = '';
        foreach($data as $key => $value){
            $str .= $key;
            $str .= '=';
            $str .= $value;
            $str .= ';';
        }
        $str = substr($str, 0, -1);
        curl_setopt($this->_resource, CURLOPT_COOKIE, $str);
    }


	// 发送Post请求
	/**
	 * @param string $url
	 * @param array $data 要提交的参数
	 * @param string $type 提交方式 可选值 parameter:参数 json:json格式 默认 parameter
	 * @param $cookie
	 * @return mixed
	 */
	public static function SendPost($url, $data, $type = 'parameter', $cookie = null){
		if($type == 'json'){
			$data_string = json_encode($data, JSON_UNESCAPED_UNICODE);
		} else {
			$data_string = $data;
		}
		$curl = new Curl($url);

		if(is_array($cookie)){
			$curl->setCookies($cookie);
		}
		$curl->ReturnTransfer = true;
		$curl->CustomreQuest = 'POST';
		$curl->PostFields = $data_string;
		if($type == 'json'){
			$curl->HttpHeader = array(
				'Content-Type: application/json',
				'Content-Length: ' . strlen($data_string)
			);
		}
		return json_decode($curl->Exec(),true);
	}

    /**
     * 发送Get请求，以Json方式解析结果
     * @param $url
     * @param null $data
     * @return mixed
     * @throws Exception
     */
    public static function SendJsonGet($url,$data = null, $cookie = null){
        // Get参数
        if(is_array($data)){
            $url .= '?';
            foreach($data as $key => $value){
                $url .= $key;
                $url .= '=';
                $url .= $value;
                $url .= '&';
            }
            $url = substr($url, 0, -1);
        }
        $curl = new Curl($url);
        if(is_array($cookie))
            $curl->setCookies($cookie);
        $curl->ReturnTransfer = true;
        return json_decode($curl->Exec(),true);
    }

    /**
     * 通过url抓取页面内容
     * @param string $url
     * @param bool $returnTransfer
     * @return string
     * @throws Exception
     */
    public static function FetchHtmlFromUrl($url, $returnTransfer=true){
        $curl = new Curl($url);
        $curl->ReturnTransfer = $returnTransfer;
        return $curl->Exec();
    }

}